#pragma once
#include <functional>

#include "global_env.h"
#include "sys/socket.h"

using SignalCallBack = std::function<void(int)>;

// static避免了多模块引用造成的函数重复定义错误
// 收到信号后往管道里写
static void DefaultCallBack(int sig){
    /*保留errno，在最后恢复，保证函数可重入性*/
    int save_errno = errno;
    int msg = sig;
    int ret = send(g_pipefd[1], (char *) &msg, 1, 0);
    errno = save_errno;
    return ;
}

class SignalManager{

public:
    void SigHandler(int sig);

    void RegisterSig(int sig, const SignalCallBack& SignalCallBack = DefaultCallBack);

    bool Init();

    void HandleSignals();
};